
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>2、JDBC使用连接池 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>2、JDBC使用连接池 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">数据库连接池的核心目的是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">数据库连接池通过预先创建一定数量的数据库连接，并将这些连接保存在池中，供程序随时复用，从而极大地减少了数据库连接的创建和销毁开销。</div>
          </div>
          <div class="card-source">来源: JDBC使用连接池</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">数据库连接池的核心优势体现在哪两个方面？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">数据库连接池的核心优势是性能提升和资源管理。它可以在高并发场景下，减少数据库连接的建立和释放带来的性能瓶颈，同时提供连接的复用、共享和管理。</div>
          </div>
          <div class="card-source">来源: JDBC使用连接池</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">除了提升性能，连接池还有哪些重要作用？请列举至少三项。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">1. 资源管理：管理连接的生命周期，避免连接泄漏或数据库连接耗尽的情况。 2. 并发处理：高效地管理连接的分配和回收，从而支持更多的并发请求。 3. 避免连接过多：可以限制同时打开的连接数，防止数据库连接数量过多导致数据库性能下降或崩溃。</div>
          </div>
          <div class="card-source">来源: 2. 连接池的作用</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">Spring Boot 默认使用哪种数据库连接池？其主要特点是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Spring Boot 默认的数据库连接池实现是 HikariCP。它是一个轻量级、高性能的连接池，以高效、低延迟为特点，在高并发场景下表现出色，其性能在所有连接池中是公认最好的。</div>
          </div>
          <div class="card-source">来源: 3. HikariCP</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">C3P0 连接池在高并发场景下存在哪些主要缺点？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">在高并发场景下性能相对较低，且内存占用较大。此外，它的配置和调优相对复杂，初学者可能需要时间理解。</div>
          </div>
          <div class="card-source">来源: 2. C3P0</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">为什么不推荐在新项目中使用 BoneCP 连接池？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">因为它已不再活跃更新，存在安全和维护上的风险。相比于 HikariCP，其性能和稳定性也较差。</div>
          </div>
          <div class="card-source">来源: 5. BoneCP（已不再维护）</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">配置</div>
          <div class="card-question">连接池配置参数 `checkoutTimeout` 的作用是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">配置</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">该参数指定了客户端获取数据库连接时最多等待的时间（单位：毫秒）。如果连接池中的连接已满且没有空闲连接可用，系统将会等待，若等待时间超过这个值，系统会抛出 SQLException 异常。</div>
          </div>
          <div class="card-source">来源: 1. checkoutTimeout（获取连接时的最大等待时间）</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">配置</div>
          <div class="card-question">在连接池配置中，`maxIdleTime` 和 `maxConnectionAge` 这两个参数有何不同？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">配置</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`maxIdleTime` 指的是连接在池中保持空闲状态的最大时间（单位：秒），超过此值的空闲连接会被关闭。而 `maxConnectionAge` 指的是连接的最大生存周期（单位：秒），超过此生存周期的连接无论是否空闲都会被关闭，并重新创建新连接。</div>
          </div>
          <div class="card-source">来源: 连接池的配置参数</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">问题</div>
          <div class="card-question">什么是“连接池泄漏”？应如何从代码层面和配置层面解决这个问题？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">问题</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">连接池泄漏指应用程序从连接池获取连接后未正确释放，导致池中可用连接数逐渐减少。代码层面的解决方案是确保在 `finally` 块中关闭连接；配置层面的解决方案是启用连接池的连接泄漏检测功能，例如 C3P0 提供的 `checkForLeaks` 参数。</div>
          </div>
          <div class="card-source">来源: 1. 连接池泄漏</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">问题</div>
          <div class="card-question">如何通过配置连接池来避免应用获取到已失效或过期的数据库连接？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">问题</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">可以通过启用连接验证机制来解决。例如，设置 `testConnectionOnCheckout` 为 `true`，这样每次从连接池获取连接时，都会执行一个简单的SQL查询（如 `SELECT 1`）来验证连接是否是可用的。</div>
          </div>
          <div class="card-source">来源: 3. 数据库连接过期或失效</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">优化</div>
          <div class="card-question">在优化连接池性能时，缓存预编译语句（PreparedStatement）有什么好处？相关的配置参数是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">优化</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">缓存预编译SQL语句可以加速数据库的查询处理，因为SQL语句只需要编译一次，后续执行可直接利用缓存的执行计划。相关的配置参数是 `maxStatements`，它用于设置连接池可以缓存的最大预编译SQL语句数。</div>
          </div>
          <div class="card-source">来源: 4. 预编译语句缓存</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">优化</div>
          <div class="card-question">将连接池的 `maxPoolSize` (最大连接数) 设置得过大或过小分别会带来什么问题？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">优化</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">将 `maxPoolSize` 设置过大可能会导致数据库过载，浪费资源；而设置过小则可能导致连接请求被挂起，影响系统响应效率。</div>
          </div>
          <div class="card-source">来源: 1. 合理配置连接池大小</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
